/*
 * UnitBuilder.h
 *
 *  Created on: Nov 3, 2008
 *      Author: Ryan
 */

#ifndef UNITBUILDER_H_
#define UNITBUILDER_H_

#include "Unit.h"

#include <set>

namespace OOInterface
{
class Resource;

typedef std::set< ConstUnitPtr > ConstUnitSet;

class UnitBuilder
{
public:
	virtual UnitBuilder& addName( std::string name ) = 0;
	virtual UnitBuilder& addID( int id ) = 0;
	virtual UnitBuilder& addSize( unsigned int xSize, unsigned int ySize ) = 0;
	virtual UnitBuilder& addMaxHealth( float max ) = 0;
	virtual UnitBuilder& addBuildTime( float time ) = 0;
	virtual UnitBuilder& addTransportability() = 0;

	virtual UnitBuilder& addResourceCost( const Resource& r, float amt ) = 0;
	virtual UnitBuilder& addResourceUpkeep( const Resource& r, float amt ) = 0;
	virtual UnitBuilder& addResourceStorage( const Resource& r, float amt ) = 0;
	virtual UnitBuilder& addResourceGeneration( const Resource& r, float amt ) = 0;

	virtual UnitBuilder& addResourceExtractorAspect( const Resource& r, float radius ) = 0;


	virtual UnitBuilder& addAirAspect( float minHeight, float maxHeight ) = 0;
	virtual UnitBuilder& addWaterAspect() = 0;
	virtual UnitBuilder& addLandAspect() = 0;

	virtual UnitBuilder& addTransportAspect() = 0;

	virtual UnitBuilder& addBuilderAspect( const ConstUnitSet& buildableUnits, float buildDistance = 0.0f, float buildSpeed = 0.0f, float repairSpeed = 0.0f, float captureSpeed = 0.0f, float reclaimSpeed = 0.0f) = 0;
	virtual UnitBuilder& addBuildingAspect( float minWaterDepth, float maxWaterDepth, float maxHeightDifference ) = 0;
};

}

#endif /* UNITBUILDER_H_ */
